package models.dao;
import utilidades.DataBaseInstance;
import static utilidades.DataBaseInstance.closeConnection;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import models.entity.Cliente;

public class ClienteDao {
     protected Connection getConnection() {
        return DataBaseInstance.getInstanceConnection();
    }
    
public List<Cliente>findPorNombre(String nombre){
        List<Cliente> listaClientes = new ArrayList<Cliente>();
        ResultSet result = null;
        try {
            String query = "SELECT * FROM APP.cliente WHERE nombre LIKE ?";
            PreparedStatement stmt = getConnection().prepareStatement(query);
            stmt.setString(1,"%"+nombre+"%");
            result = stmt.executeQuery();
            while (result.next()) {
                Cliente cliente = new Cliente();
                cliente.setRut(result.getString("rut"));
                cliente.setNombre(result.getString("nombre"));
                cliente.setPaterno(result.getString("paterno"));
                cliente.setMaterno(result.getString("materno"));
                cliente.setTelefono(result.getInt("telefono"));
                cliente.setEmail(result.getString("email"));
                listaClientes.add(cliente);
            }
            result.close();
            stmt.close();
            closeConnection();
        } catch (SQLException se) {
            System.out.println(se.toString());
            System.err.println("Se ha producido un error de BD.");
            System.err.println(se.getMessage());
        }
        return listaClientes;
}    
    
    public List<Cliente> findAll() {
        List<Cliente> listaClientes = new LinkedList<Cliente>();
        ResultSet result = null;
        try {
            String query = "SELECT * FROM APP.cliente";
            Statement stmt = getConnection().createStatement();
            result = stmt.executeQuery(query);
            while (result.next()) {
                Cliente cliente = new Cliente();
                cliente.setRut(result.getString("rut"));
                cliente.setNombre(result.getString("nombre"));
                cliente.setPaterno(result.getString("paterno"));
                cliente.setMaterno(result.getString("materno"));
                cliente.setTelefono(result.getInt("telefono"));
                cliente.setEmail(result.getString("email"));
                listaClientes.add(cliente);
            }
            result.close();
            stmt.close();
            closeConnection();
        } catch (SQLException se) {
            System.out.println(se.toString());
            System.err.println("Se ha producido un error de BD.");
            System.err.println(se.getMessage());
        }
        return listaClientes;
    }

    public Cliente findByRut(String clienteRut) {
        ResultSet result = null;
        Cliente cliente = null;
        try {
            String query = "SELECT * FROM APP.cliente WHERE  rut = ?";
            PreparedStatement stmt = getConnection().prepareStatement(query);
            stmt.setString(1, clienteRut);
            result = stmt.executeQuery();
            if (!result.next()) {
                throw new SQLException();
            }
            cliente = new Cliente();
            cliente.setRut(result.getString("rut"));
            cliente.setNombre(result.getString("nombre"));
            cliente.setPaterno(result.getString("paterno"));
            cliente.setMaterno(result.getString("materno"));
            cliente.setTelefono(result.getInt("telefono"));
            cliente.setEmail(result.getString("email"));

            result.close();
            stmt.close();
            closeConnection();
        } catch (SQLException se) {
            System.err.println("Se ha producido un error de BD.");
            System.err.println(se.getMessage());
        }
        return cliente;
    }

    public void save(Cliente cliente) {
        PreparedStatement saveCliente;
        try {
            saveCliente = getConnection().prepareStatement(
                    "INSERT INTO APP.cliente VALUES (?, ?, ?, ?, ?, ?)");
            saveCliente.setString(1, cliente.getRut());
            saveCliente.setString(2, cliente.getNombre());
            saveCliente.setString(3, cliente.getPaterno());
            saveCliente.setString(4, cliente.getMaterno());
            saveCliente.setInt(5, cliente.getTelefono());
            saveCliente.setString(6, cliente.getEmail());
            saveCliente.executeUpdate();
            closeConnection();
        } catch (SQLException se) {
            System.err.println("Se ha producido un error de BD.");
            System.err.println(se.getMessage());
        }
    }
    
    public void update(Cliente cliente) {
        PreparedStatement saveCliente;
        try {
            saveCliente = getConnection().prepareStatement(
                 "UPDATE APP.cliente SET nombre = ?, paterno = ?, materno = ?, "
                    + "telefono = ?, email = ? WHERE  rut = ?");
            saveCliente.setString(1, cliente.getNombre());
            saveCliente.setString(2, cliente.getPaterno());
            saveCliente.setString(3, cliente.getMaterno());
            saveCliente.setInt(4, cliente.getTelefono());
            saveCliente.setString(5, cliente.getEmail());
            saveCliente.setString(6, cliente.getRut());
            saveCliente.executeUpdate();
            closeConnection();
        } catch (SQLException se) {
            System.err.println("Se ha producido un error de BD.");
            System.err.println(se.getMessage());
        }
    }

    public void delete(Cliente cliente) {
        PreparedStatement delCliente;
        try {
            delCliente = getConnection().prepareStatement(
                    "DELETE FROM APP.cliente WHERE rut = ?");
            delCliente.setString(1, cliente.getRut());
            delCliente.executeUpdate();
            closeConnection();
        } catch (SQLException se) {
            System.err.println("Se ha producido un error de BD.");
            System.err.println(se.getMessage());
        }
    }

    protected void closeConnection() {
        DataBaseInstance.closeConnection();
    }
}